perm filename INIT.SAI[PNT,HE]9 blob sn#417608 filedate 1979-02-12 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	ENTRY
C00012 ENDMK
C⊗;
ENTRY;
BEGIN "INIT2"

DEFINE $INIT=TRUE;
REQUIRE "HEADER.SAI" SOURCE_FILE;

DEFINE II=0;
DEFINE MAKEOP(OPNUM,OPNAM)"[]"=
	[ REDEFINE II = II + 2 ;
	DEFINE OPNUM = II ; ];

REQUIRE "INTOPS.SAI" SOURCE_FILE;
REQUIRE "MOVE.DEF[PNT,HE]" SOURCE_FILE;


PROCEDURE INISCANNER;
	BEGIN
	INTEGER I;		
	FOR I←#MIN STEP 1 UNTIL #MAX DO $ENTRY[I]←0;
	STOKEN←FALSE;
	$ALLOW←0;
	$TTYFL←NULL;
	$TOTFL←0;
	$ALFL←"DECLAR.AL";		! default name for input/output file;
	$EPS←0.001;

	DEVICE←TTY_X;	! input is from teletype;
	TTYUP(TRUE);	! all input from teletype to be converted to UPPER case;
	END;

PROCEDURE INIOFFSET;
BEGIN
	ALEVENTOFF←'400;
	ARROFF[#SC]←'401;
	ARROFF[#VT]←'402;
	ARROFF[#RT]←ARROFF[#TR]←ARROFF[#FR]←'403;
	$SYMOFF←'404;
END;

PROCEDURE TMPOFFSET;
BEGIN
	INTEGER ARRAY ARR[1:6];
	INTEGER I; ! make 9 new scalars because 10th is already made in AL;
	INTEGER INDEX;
	$TSCOFF←$SYMOFF;
	$TTROFF←$SYMOFF+10;
	$SYMOFF←$TTROFF+10;
	INDEX←0;
	FOR I←XMVAR,#SC,9,#RT,10,0 DO ARR[INDEX←INDEX+1]←I;
	$EXECUTE(αEXPR$(ARR,0));
END;

REQUIRE "⊂⊃⊂⊃" DELIMITERS;

REQUIRE "AIDEFS.SAI[AID,HE]" SOURCE_FILE;

PROCEDURE INIMAXOFFSET;
	BEGIN
	INTEGER I;
	ARRCLR(OFFSET);	! clear data array of offsets;
	OFFSET[MAX_OFFSET,#SC]←NO_OF_SCALARS;
	OFFSET[MAX_OFFSET,#VT]←NO_OF_VECTORS;
	OFFSET[MAX_OFFSET,#FR]←OFFSET[MAX_OFFSET,#TR]←
		OFFSET[MAX_OFFSET,#RT]←NO_OF_TRANSES;
	OFFSET[MAX_OFFSET,#MC]←NO_OF_MACROS;
	OFFSET[MAX_OFFSET,#FN]←NO_OF_FUNCTIONS;
	END;

REQUIRE UNSTACK_DELIMITERS;

PROCEDURE INIWORLD;
	BEGIN
	WORLD←ENSYM("STATION",#FR,F_WRLD←MK_REC(#FR));
	FRAME:PNAME[F_WRLD]←"STATION";
	END;

PROCEDURE SETOFFSET(INTEGER INDEX);
	BEGIN
	INTEGER I;
	IF INDEX≠CON_OFFSET AND INDEX≠PRG_OFFSET THEN OUTSTR("error in SETOFFSET")
	  ELSE FOR I←1 STEP 1 UNTIL 7 DO OFFSET[INDEX,I]←OFFSET[CUR_OFFSET,I];
	END;

PROCEDURE SAVRESOFFSET;
	BEGIN
	INTEGER I;
	FOR I←#MIN STEP 1 UNTIL #MAX DO OFFSET[RES_OFFSET,I]←$ENTRY[I];
	END;

PROCEDURE GTARMOFFSET;
	BEGIN
	INTEGER I,NILROTOFF,NILTRANSOFF;
	SYMBOL:OFFSET[HANDY←CHECK("YHAND",#SC)]←YHD_ALOFFSET;
	SYMBOL:INDEX[HANDY]←0;
	SYMBOL:OFFSET[HANDB←CHECK("BHAND",#SC)]←BHD_ALOFFSET;
	SYMBOL:INDEX[HANDB]←0;
	SYMBOL:OFFSET[YARM←CHECK("YARM",#FR)]←YRM_ALOFFSET;
	SYMBOL:INDEX[YARM]←0;
	SYMBOL:OFFSET[BARM←CHECK("BARM",#FR)]←BRM_ALOFFSET;
	SYMBOL:INDEX[BARM]←0;
	NILROTOFF←SYMBOL:INDEX[CHECK("NILROT",#RT)];
	NILTRANSOFF←SYMBOL:INDEX[CHECK("NILTRANS",#TR)];
	OFFSET[ARM_OFFSET,#SC]←OFFSET[CUR_OFFSET,#SC];
	OFFSET[ARM_OFFSET,#VT]←OFFSET[CUR_OFFSET,#VT];
	OFFSET[ARM_OFFSET,#RT]←NILROTOFF;
	OFFSET[ARM_OFFSET,#TR]←NILTRANSOFF;
	OFFSET[ARM_OFFSET,#FR]←OFFSET[CUR_OFFSET,#FR];
	END;


PROCEDURE ARMPCODE;
	BEGIN
	! to set up an array of pcode to update arm values;
	INTEGER ARRAY ARMREAD[1:8],MECH[1:3];
	INTEGER I,INDEX;
	INDEX←0;
	FOR I←XWHERE,BARM_MECH,
		XCHNGE,BRM_ALOFFSET,
	      XWHERE,BHAND_MECH,
		XCHNGE,BHD_ALOFFSET
		DO ARMREAD[INDEX←INDEX+1]←I;
	$ARMPCODE←αEXPR$(ARMREAD,0);
	INDEX←0;
	FOR I←XGTVAL,BRM_ALOFFSET,XRTVAL DO MECH[INDEX←INDEX+1]←I;
	$BRMUPDATE←αEXPR$(MECH,#FR);
	ADDTEN($BRMUPDATE,αTEN$(XXASSIGN,#FR,BARM));
	INDEX←0;
	FOR I←XGTVAL,BHD_ALOFFSET,XRTVAL DO MECH[INDEX←INDEX+1]←I;
	$BHDUPDATE←αEXPR$(MECH,#SC);
	ADDTEN($BHDUPDATE,αTEN$(XXASSIGN,#SC,HANDB));
	END;


PROCEDURE INIBRK;
BEGIN
STRING BTABLE;
BTABLE←":<>≤≥≡≠⊂⊃={}.,;[]()+-*/←↑↓→?α$|⊗"&LF&CR&TAB&FF&SP&dquote;
SETBREAK ($CRTAB ←GETBREAK,CR,LF&FF,"INSK");
SETBREAK ($FFTAB ←GETBREAK,FF,NULL,"INSK");
SETBREAK ($RETAB ←GETBREAK,BTABLE,NULL,"INR");		! used by gtoken;
SETBREAK ($SKTAB ←GETBREAK,BTABLE,NULL,"INS");
SETBREAK ($SPCTAB←GETBREAK,TAB&SP,NULL, "XNR");
SETBREAK ($ALFTAB←GETBREAK,NULL,NULL,"XRN");
SETBREAK ($NUMTAB←GETBREAK,"@+-0123456789",NULL,"XNR");	! as table 10;
SETBREAK ($DSHTAB←GETBREAK,"_",NULL,"INS");		! used by COPY/MERGE;
SETBREAK ($ERRTAB←GETBREAK,BTABLE,SP&CR,"IN");		! used while recovering;
SETBREAK ($BSKTAB←GETBREAK,NULL,SP,"IN");		! used to eliminate blanks;
SETBREAK ($DPYTAB←GETBREAK,CR,CRLF,"INS");		! used for display;
$BLANK←"                                        ";
SETFORMAT(0,3);
END;

PROCEDURE CONSTDATA;
	BEGIN
	! read in and set up temporary scalars;
	ASKUSER("SCALAR "&RUBOUT&"I1, "&RUBOUT&"I2,"&RUBOUT&"I3, "&RUBOUT&"I4, "
			&RUBOUT&"I5; ___ENDASKUSER
");
	GTOKEN;
	SETOFFSET(PRG_OFFSET);
	WHILE NOT EQU(TOKEN,"___ENDASKUSER") DO
	BEGIN
	    STOKEN←TRUE;
	    PARSE;
	    GTOKEN;
	END;
	MTYDEVSTACK;
	! read in and set up constant data fields;
	READCODE("POINTY.INI[PNT,HE]");
	GTOKEN;
	WHILE NOT EQU(TOKEN,"_____END____INIT") DO
	BEGIN
	    STOKEN←TRUE;
	    PARSE;
	    GTOKEN;
	END;
	MTYDEVSTACK;
	$ALLOW←0;
	END;


PROCEDURE ARMPCODE0;
	BEGIN
	! to do no-ops for the armread during initialization;
	INTEGER ARRAY BUFF[1:1];
	BUFF[1]←XNOOP;
	$ARMPCODE←αEXPR$(BUFF,0);
	END;

DEFINE #USERS=11;
PRESET_WITH
	"TOB","ARG","MSM"," HN","JKS","ROD",
	"RDG"," NH"," ES","KFL","WRM";
STRING ARRAY USERID[1:#USERS];
PRESET_WITH
	"Tom","Ron","Shahid","Hamid","Ken","Rod",
	"Russell","Norm","Gene","Karl","Bill";
STRING ARRAY USERNAME[1:#USERS];

PROCEDURE GETUSERNAME;
BEGIN
	INTEGER I; STRING ID;
	ID←CVXSTR(CALL(0,"DSKPPN"));	! look at alias;
	ID←ID[4 TO 6];
	FOR I←1 STEP 1 UNTIL #USERS
		DO IF EQU(ID,USERID[I]) THEN DONE;
	IF I>#USERS THEN
		BEGIN
		ID←CVXSTR(CALL(0,"GETPPN"));	! look at login ppn;
		ID←ID[4 TO 6];
		FOR I←1 STEP 1 UNTIL #USERS
			DO IF EQU(ID,USERID[I]) THEN DONE;
		END;
	IF I>#USERS THEN BEGIN OUTSTR("I haven't met you before, what is your name?  ");
			$USERNAME←INCHWL;
			END
		ELSE $USERNAME←USERNAME[I];
END;

INTERNAL PROCEDURE INIT;
	BEGIN
	ALINIT;
	INISCANNER;	! initialize the scanner;
	INIMAXOFFSET;	! initialize the offset tables;
	INIOFFSET;	! initialize arroff,varoff,byvar;
			! dont change order of above two because inimaxoffset
				clears the array;
	INIBRK;		! initialize break tables;
	INIWORLD;
	ARMPCODE0;
	CONSTDATA;	! read in constant data;
	SETOFFSET(CON_OFFSET);
			! remember the current offsets;
	SAVRESOFFSET;
	GTARMOFFSET;	! keep offsets for arms;
	ARMPCODE;	! set up pcode array for reading arm positions;
	TMPOFFSET;	! set up temporary variables;
	GETUSERNAME;
	END;

REQUIRE INIT INITIALIZATION;

END;